
package modelo;

import proyecto2011.Archivo;
import java.util.Vector;

/**
 * Clase que representa una funcion 
 * @author Jaime Painefilu - Juan Demo 
 */
public class Funcion {
        String nombre;
        int nroParametro;
        boolean returnTrigger;
        Vector parametros;

        public Funcion(String nombre) {
            this.nombre = nombre;
            this.nroParametro = 0;
            this.returnTrigger = false;
            this.parametros = new Vector();
        }

        public String getNombre() {
            return nombre;
        }

        public void setNombre(String nombre) {
            this.nombre = nombre;
        }

        public int getNroParametro() {
            return nroParametro;
        }

        public void setNroParametro(int nroParametro) {
            this.nroParametro = nroParametro;
        }

        public void showParametros(Archivo arch){
            Parametro par;
            for(int i=0; i<this.parametros.size(); i++){
                par = (Parametro) this.parametros.elementAt(i);
                par.showParametro(arch);
            }
        }

        public boolean isReturnTrigger() {
            return returnTrigger;
        }

        public void setReturnTrigger(boolean returnTrigger) {
            this.returnTrigger = returnTrigger;
        }

        public Vector getParametros() {
            return parametros;
        }

        public void setParametros(Vector parametros) {
            this.parametros = parametros;
        }

        public void addParametro(Parametro par){
            this.parametros.addElement(par);
        }

        public int existParametro(String par){
            Parametro par0;
            int pos = -1;
            for(int i=0; i<this.parametros.size(); i++){
                par0 = (Parametro) this.parametros.elementAt(i);
                if(par0.getNombre().equals(par)) pos = i;
            }
            return pos;
        }

        public void showFuncion(Archivo arch){
            int i;
            Parametro par;

            if(!this.parametros.isEmpty()){
                par = (Parametro) this.parametros.elementAt(0);
                if(par.tipo.equals("trigger")) arch.escribirLinea("\n    + Funcion usada en Trigger: "+this.getNombre());
                else arch.escribirLinea("\n    + Funcion: "+this.getNombre());
            }
            arch.escribirLinea("(");
            for(i=0; i<this.parametros.size()-1; i++){
                par = (Parametro) this.parametros.elementAt(i);
                par.showParametro(arch);
                arch.escribirLinea(", ");
            }
            par = (Parametro) this.parametros.elementAt(i);
            par.showParametro(arch);
            arch.escribirLinea(")");
        }

        public void compararFuncion(Funcion fun, Archivo arch){
            Vector parametrosExtras = new Vector();
            int posActual;
            Parametro par;

            if(!fun.parametros.isEmpty()){
                par = (Parametro) fun.parametros.elementAt(0);
                if(par.tipo.equals("trigger")) arch.escribirLinea("      <>Funcion usada en Trigger: "+fun.getNombre());
                else arch.escribirLinea("      <>Funcion: "+fun.getNombre());
            }
            arch.escribirLinea("\n");
            if(!(this.nroParametro == fun.nroParametro)||!(this.returnTrigger == fun.returnTrigger)){
                arch.escribirLinea("        << ADVERTENCIA! >> Funciones '"+this.nombre+"' difieren en: \n");
                if(!(this.nroParametro == fun.nroParametro)){
                    arch.escribirLinea("        - Numero de parametros\n");
                }
                if(!(this.returnTrigger==fun.returnTrigger)) arch.escribirLinea("       -Retorno\n");
                this.showFuncion(arch);
                fun.showFuncion(arch);
            }

            /*
             * INICIA COMPARACION DE PARAMETROS
             */
            for(int j=0; j<fun.parametros.size(); j++){
                par = (Parametro) fun.parametros.elementAt(j);
                posActual = this.existParametro(par.getNombre());
                if(0 <= posActual){
                    par.compararParametro((Parametro)this.parametros.remove(posActual), arch);
                }
                else parametrosExtras.addElement(fun);
            }
            if(!this.parametros.isEmpty()){
                arch.escribirLinea("    << ADVERTENCIA! >> Parametros extra en Funcion: '"+this.getNombre()+"' (1er ESQUEMA) \n");
                this.showParametros(arch);
            }
            if(!parametrosExtras.isEmpty()){
                arch.escribirLinea("    << ADVERTENCIA! >> Parametros extra en Funcion: '"+fun.getNombre()+"' (2do ESQUEMA) \n");
                for(int i=0; i<parametrosExtras.size(); i++){
                    fun = (Funcion) parametrosExtras.elementAt(i);
                    fun.showFuncion(arch);
                }
            }
            arch.escribirLinea("\n\n");
        }
    

}
